home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / GRAPHICS / GMSMTH01.ZIP / TITLE3D.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-12-08  |  9.6 KB  |  364 lines

  1. /*
  2.    Mike's original comments:
  3.  
  4.    Sample X-Sharp 3D animation program. Demonstrates ambient and diffuse
  5.    shading, with up to three spotlights and ambient shading of a white ball.
  6.    The ambient light is green, as are two of the spots; given the palette
  7.    set-up, which is optimized for pure primary colors by assigning 64 levels
  8.    to each primary, shading with all green looks very good. The third
  9.    spotlight is blue; when it's on and any other lighting source is on,
  10.    color quantization problems become apparent; because the palette has only
  11.    four levels of each primary for use in mixing, only very rough
  12.    approximations of mixed colors can be displayed.
  13.  
  14.    All C code tested with Borland C++ 3.0 in C compilation mode and the
  15.    small model.
  16.    
  17.  
  18.    modified by Bruce Miller to spin our sign
  19.    
  20.    */
  21.  
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <conio.h>
  25. #include <dos.h>
  26. #include <string.h>
  27.  
  28. #include <pr2.h>
  29. #include <mode13.h>
  30. #include <readlbm.h>
  31. #include <fstring.h>
  32. #include <g_io.h>
  33. #include <gui.h>
  34. #include <erase.h>
  35. #include <die.h>
  36. #include <gmalloc.h>
  37. #include <gsound.h>
  38.  
  39. #include <Xlib_all.h>
  40.  
  41. #include <polygon.h>
  42. #include "initsign.h"
  43.  
  44.  
  45. #define NUM_MOVES_AWAY 256
  46.  
  47. #define NUM_MOVES_DOWN_TOWARD 300
  48. #define NUM_MOVES_UP_TOWARD 90
  49.  
  50. /* Contains flags indicating pending ball moves */
  51. short BallEvent = 0;
  52.  
  53. void DisplayInstructions(void) {
  54.    printf("Control keys:\n");
  55.    printf(" 0, 1, 2: toggle spotlights 0, 1, and 2 on and off\n");
  56.    printf(" A      : move ball away from you\n");
  57.    printf(" B      : toggle ambient (background) light on and off\n");
  58.    printf(" S      : flip the spin axis from X to Y or Y to X\n");
  59.    printf(" T      : move ball toward you\n");
  60.    printf(" arrows : move ball up, down, left, right\n");
  61.    printf(" Esc    : exit\n");
  62.    printf("\nPress any key to begin...\n");
  63.    if (getch() == 0x1B) exit(0);
  64. }
  65.  
  66. void main(void)
  67. {
  68. int vertIndex = 0;
  69.  
  70. short Done = 0, i, count;
  71. Object *ObjectPtr;
  72. unsigned long t1, t2;
  73. BYTE far *shape;
  74. event_t event;
  75. short rot_state=0, accn_state=0;
  76. Fixedpoint sin, cos;
  77. short PolySpeed=0;
  78. short movesUpDown = 0;
  79. //   DisplayInstructions();  /* put up opening instruction screen */
  80.  
  81.    init_exit();
  82.    init_mem_list();
  83.    init_timer();
  84.    init_xmode_video();
  85.    init_events("crshair.cbm");
  86.    gb_auto_repeat=1;
  87.  
  88.    /* Clip rectangle; clips to the screen */
  89.    PolyClipMinX = 0;
  90.    PolyClipMinY = 0;
  91.    PolyClipMaxX = ScrnLogicalPixelWidth;
  92.    PolyClipMaxY = ScrnLogicalHeight;
  93.  
  94.    PolyCentreX=ScrnLogicalPixelWidth>>1;
  95.    PolyCentreY=ScrnLogicalHeight>>1;
  96.    PolyScreenWidth=INT_TO_FIXED(-ScrnLogicalPixelWidth);
  97.  
  98. pr2("init obj");
  99.    InitializeObjectList(); /* set up the initial objects */
  100. pr2("init fixed");
  101.    InitializeFixedPoint(); /* set up fixed-point data */
  102.  
  103. pr2("load shape");
  104.  shape=far_load("t.m13");
  105.    if ( !shape )
  106.      {
  107.      die("t.m13 not found");
  108.       }
  109. pr2("initballs");
  110.    InitializeBalls(shape);      /* set up the ball(s) and add them to the
  111.                               object list */
  112.    /* set palette */
  113. pr2("loading palette");
  114.    if ( load_palette("title3d.pal", palette) )
  115.       {
  116.       die("error getting palette");
  117.       }
  118.  
  119.    setvgapalette(palette);
  120.  
  121. pr2("NumObjects = %d", NumObjects);
  122.  
  123.    count=100;
  124.    t1=TICKS;
  125.  
  126.   // initialize start location
  127.   ObjectPtr = ObjectListStart.NextObject;
  128.   for( i= 0; i < NUM_MOVES_AWAY; i++ )
  129.      {
  130.      BallEvent |= MOVE_AWAY;
  131.      BallEvent |= MOVE_AWAY;
  132.      BallEvent |= MOVE_UP;
  133.      RotateAndMoveSign(ObjectPtr);
  134.      }
  135.  
  136.    /* Keep transforming the objects, drawing them to the undisplayed page,
  137.       and flipping the page to show them */
  138.    do {
  139.  
  140.       /* For each object, regenerate viewing info, if necessary */
  141.       for (i=0, ObjectPtr = ObjectListStart.NextObject; i<NumObjects;
  142.             i++, ObjectPtr = ObjectPtr->NextObject)
  143.          {
  144.          if (ObjectPtr->RecalcXform || RecalcAllXforms)
  145.             {
  146.             XformAndProjectPObject(ObjectPtr);
  147.             ObjectPtr->RecalcXform = 0;
  148.             }
  149.          }
  150.       RecalcAllXforms = 0;
  151.  
  152.       x_screen_fill(HiddenPageOffs, 0);
  153.  
  154.       /* Sort the objects so we can draw them back to front */
  155.       SortObjects();
  156.  
  157.       /* Draw all objects */
  158.       for (i=0, ObjectPtr = ObjectListStart.NextObject; i<NumObjects;
  159.             i++, ObjectPtr = ObjectPtr->NextObject)
  160.          {
  161.          if ( !((PObject *)ObjectPtr)->not_draw )
  162.             DrawPObject(ObjectPtr);
  163.          }
  164.  
  165.  
  166.       /* Let the user control ball location */
  167. ///*
  168.      if ( get_event(&event) )
  169.          {
  170.          switch ( event.type )
  171.             {
  172.             case E_B0_DN:
  173.                PolySpeed=0;
  174.                break;
  175.             case E_B1_DN:
  176.                ViewAngle=0;
  177.                break;
  178.  
  179.             case E_JOY_X_LEFT:
  180.                rot_state=5;
  181.                break;
  182.  
  183.             case E_JOY_X_CENTRE:
  184.                rot_state=0;
  185.                break;
  186.  
  187.             case E_JOY_X_RIGHT:
  188.                rot_state=-5;
  189.                break;
  190.  
  191.             case E_JOY_Y_UP:
  192.                accn_state=-1;
  193.                break;
  194.  
  195.             case E_JOY_Y_CENTRE:
  196.                accn_state=0;
  197.                break;
  198.  
  199.             case E_JOY_Y_DOWN:
  200.                accn_state=1;
  201.                break;
  202.  
  203.             case E_KEY:
  204.                if ( event.sub_type == E_UP )
  205.                   {
  206.                   switch ( event.d2 )
  207.                      {
  208.                      case ESC:
  209.                         Done=1;
  210.                         break;
  211.  
  212.                      }
  213.                   }
  214.                else
  215.                   {
  216.                   switch ( event.d2 )
  217.                      {
  218.                      case (UP | KM_CTRL_PLUS):
  219.                         BallEvent |= MOVE_UP;
  220.                         break;
  221.  
  222.                      case (DOWN | KM_CTRL_PLUS):
  223.                         BallEvent |= MOVE_DOWN;
  224.                         break;
  225.  
  226.                      case UP:
  227.                         BallEvent |= MOVE_TOWARD;
  228.                         break;
  229.  
  230.                      case DOWN:
  231.                         BallEvent |= MOVE_AWAY;
  232.                         break;
  233.  
  234.                      case SPACE:
  235.                         BallEvent |= FLIP_SPIN_AXIS;
  236.                         break;
  237.  
  238.                      case LEFT:
  239.                         BallEvent |= MOVE_LEFT;
  240.                         break;
  241.  
  242.                      case RIGHT:
  243.                         BallEvent |= MOVE_RIGHT;
  244.                         break;
  245.  
  246.                      case 'v':  vertIndex--; vertIndex=max(0,vertIndex); break;
  247.                      case 'V':  vertIndex++; vertIndex=min(15,vertIndex); break;
  248.  
  249.                      case 'x':  Verts[ vertIndex ].X -= 0x10000L; break;
  250.                      case 'X':  Verts[ vertIndex ].X += 0x10000L; break;
  251.  
  252.                      case 'y':  Verts[ vertIndex ].Y -= 0x10000L; break;
  253.                      case 'Y':  Verts[ vertIndex ].Y += 0x10000L; break;
  254.  
  255.                      case 'z':  Verts[ vertIndex ].Z -= 0x10000L; break;
  256.                      case 'Z':  Verts[ vertIndex ].Z += 0x10000L; break;
  257.  
  258.                      case '0':  BallEvent |= RESET_SPIN;  break;
  259.                      case '1':  BallEvent |= SPIN_X_AXIS; break;
  260.                      case '2':  BallEvent |= SPIN_Y_AXIS; break;
  261.                      case '3':  BallEvent |= SPIN_Z_AXIS; break;
  262.  
  263.  
  264.                         }
  265.  
  266.                   }
  267.                break;
  268.  
  269.             }
  270.          }
  271. //*/
  272.  
  273.        if ( movesUpDown++ < NUM_MOVES_DOWN_TOWARD )
  274.           {
  275.           BallEvent |= MOVE_DOWN;
  276.           BallEvent |= MOVE_TOWARD;
  277.           }
  278.        else
  279.           if ( movesUpDown++ < NUM_MOVES_DOWN_TOWARD+NUM_MOVES_UP_TOWARD )
  280.              {
  281.              BallEvent |= MOVE_UP;
  282.              BallEvent |= MOVE_TOWARD;
  283.              }
  284.           else
  285.              BallEvent |= MOVE_TOWARD;
  286.  
  287.  
  288.       if ( rot_state )
  289.          {
  290.          ViewAngle+=rot_state;
  291.          if ( ViewAngle > 3600 )
  292.             {
  293.             ViewAngle=0;
  294.             }
  295.          else
  296.             {
  297.             if ( ViewAngle < 0 )
  298.                ViewAngle=3600;
  299.             }
  300.          }
  301.       if ( accn_state )
  302.          {
  303.          PolySpeed+=accn_state;
  304.          if ( PolySpeed < -10 )
  305.             PolySpeed=-10;
  306.          else
  307.             {
  308.             if ( PolySpeed > 10 )
  309.                PolySpeed=10;
  310.             }
  311.          }
  312.       if ( PolySpeed )
  313.          {
  314.          CosSin((TAngle)ViewAngle, &cos, &sin);
  315.          WorldCentre.Z+=FixedMul(INT_TO_FIXED(PolySpeed), cos);
  316.          WorldCentre.X+=FixedMul(INT_TO_FIXED(PolySpeed), sin);
  317.          }
  318.       /* Move and reorient each object */
  319.       for (i=0, ObjectPtr = ObjectListStart.NextObject; i<NumObjects;
  320.             i++, ObjectPtr = ObjectPtr->NextObject)
  321.          {
  322.          RotateAndMoveSign(ObjectPtr);
  323.          }
  324.  
  325.       BallEvent &= ~FLIP_SPIN_AXIS;
  326.       BallEvent &= ~MOVE_LEFT;
  327.       BallEvent &= ~MOVE_RIGHT;
  328.       BallEvent &= ~MOVE_DOWN;
  329.       BallEvent &= ~MOVE_TOWARD;
  330.       BallEvent &= ~MOVE_AWAY;
  331.       BallEvent &= ~MOVE_UP;
  332.       BallEvent &= ~SPIN_X_AXIS;
  333.       BallEvent &= ~SPIN_Y_AXIS;
  334.       BallEvent &= ~SPIN_Z_AXIS;
  335.       BallEvent &= ~RESET_SPIN;
  336.  
  337.  
  338.       x_page_flip(0,0);
  339.       page= page ? 0 : 1;
  340.  
  341.       --count;
  342.       if ( count == 0 )
  343.          {
  344.          t2=TICKS;
  345.          t2-=t1;
  346.          t2=1860 / t2;
  347.          pr2("%lu frames per second t1 %lu", t2, t1);
  348.          count=100;
  349.          t1=TICKS;
  350.          }
  351.  
  352.    } while (!Done);
  353.  
  354.    gfree(shape, "bitmap");
  355.    deinit_events();
  356.    deinit_xmode_video();
  357.    deinit_timer();
  358.  
  359.    exit(1);
  360. }
  361.  
  362.  
  363.  
  364.